בגלל שאתה כבר יודע מה זה סטטי, הנא שגיאה שהיום ראיתי בפעם הראשונה. (וזה אחרי די הרבה שנים ב PHP)
יודע מה הבעיה ?
PHP Fatal error: Call to private job::job() from invalid context in /home/alex/test.php on line 3
<?php
$job = new job();
$job->startJob();
class job
{
public function startJob()
{
echo 'strated doing job';
$this->job();
echo 'finished doing job';
}
private function job()
{
$i = 0;
while(++$i < 100)
{
}
}
}
$job = new job();
$job->startJob();
class job
{
public function startJob()
{
echo 'strated doing job';
$this->job();
echo 'finished doing job';
}
private function job()
{
$i = 0;
while(++$i < 100)
{
}
}
}
גרסאות: 5.3.3, 5.4.10 & 5.6-dev@phplive
iiddaannyy עלה על הבעיה ממש מהר וכתב בתגובה הראשונה למטה - מהיא.
כך שניה לחשוב לפני שאתה קורא את התגובות.
תגובות לכתבה:
למחלקה ולפעולה יש אותו השם - job. ככה שהפעולה היא בעצם פונקצית בנאי.
כיוון שהפעולה היא פרטית (private) זה אומר שקבענו בנאי private. כאשר הבנאי הוא private זה אומר שאפשר ליצור אובייקט מהמחלקה רק מתוך עצמה.
זאת אומרת שאת ה-new job אתה לא יכול לבצע מחוץ למחלקה אלא רק מתוכה (מתוך פעולה סטטית בתוכה לדוגמה).
צודק לגמרי. הבעיה בזה, שמפענח ה PHP, בגלל תאימות ל PHP4 מחליט שאם יש מטודה בשם שזהה לשם המחלקה - אז היא תהיה הבנאי. ובגלל שהיא private במקרה הזה, אנחנו מקבלים את השגיאה הזו.
הפתרון, מלבד לשנות את שמות הפונקציות, הוא להוסיף בנאי משלנו.
public function __construct(){}
וPHP תפסיק לחשוב שהמטודה job היא בנאי.
נכון. רק חשוב לציין שלפעמים בנאי private שימושי.
בסינגלטון לדוגמה, לא נרצה לאפשר ליצירת אובייקטים מהמחלקה מחוץ למחלקה ולכן נקבע בנאי private, כדי שאת יצירת האובייקט (new job) נוכל לבצע רק מתוך המחלקה עצמה.
:)
צודק, אני יצרתי מחלקה שיורשת ממחקלת חריגה (Exception) וחשבתי גם להשתמש בבנאי פרטי ,פשוט עם מתודה סטטית שיוצרת אותו וזורקת, כדי להקל על העבודה וליצור איזה סטנדרט. רק זה לא היה אפשרי כי לצערי הבנאי של מחלקת החריגה הוא פומבי , אז כבר השארתי את זה רגיל.